/**
 * 
 */
package com.proyecto.controller;

import java.beans.PropertyEditorSupport;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.proyecto.modelo.Pais;
import com.proyecto.modelo.Rol;
import com.proyecto.modelo.Usuario;
import com.proyecto.servicio.PaisSrv;
import com.proyecto.servicio.UsuarioSrv;


/**
 * @author labaronn
 *
 */
	@Controller
	@SessionAttributes("login_user")
	@RequestMapping("/usuario/*")
	public class UsuarioController{

		@Autowired
		private UsuarioSrv usuarioSrv;
		
		@Autowired(required=false)
		Validator validator;
		
		@Autowired
		private PaisSrv paisSrv;



		@RequestMapping("/listaUsuarios.do")
		public ModelAndView listaUsuarios(HttpServletRequest request,
				HttpServletResponse response, @ModelAttribute("user") Usuario usuario) {
			ModelAndView modelAndView = new ModelAndView(
					"/usuario/userForm");
			modelAndView.addObject("usuarios", usuarioSrv.obtenerUsuarios());
			modelAndView.addObject("user", usuario);
			modelAndView.addObject("paises", paisSrv.obtenerPaises());
			modelAndView.addObject("rolesUsuario", Rol.getRoles());
			modelAndView.addObject("userList", usuarioSrv.obtenerUsuarios());
			return modelAndView;
		}


		@RequestMapping("/guardarUsuario.do")
		public ModelAndView guardarUsuario(HttpServletRequest request,
				HttpServletResponse response,
				@ModelAttribute("user") Usuario usuario, BindingResult errors) {

			ModelAndView mv = new ModelAndView("/usuario/userForm");

			validarDatosIngresados(usuario, errors);
			if (!errors.hasErrors()){
				usuarioSrv.guardar(usuario);
			}		
			mv.addObject("paises", paisSrv.obtenerPaises());
			mv.addObject("rolesUsuario", Rol.getRoles());
			mv.addObject("userList", usuarioSrv.obtenerUsuarios());
			return mv;
		}


//
		@InitBinder
		protected void initBinder(HttpServletRequest request,
				ServletRequestDataBinder binder) throws Exception {
		    
			//roles
		    binder.registerCustomEditor(Rol.class, new PropertyEditorSupport() {
		        @Override
		        public void setAsText(String text) {
		        	if(!StringUtils.isBlank(text)){
			      	    int id = Integer.parseInt(text);
			            Rol valor = Rol.getRol(id);
			       	    setValue(valor);
			   	    }else{
			       	    setValue("");
			      	    }
		          }
		    });
		    
		    
			if (binder.getTarget()!=null && !binder.getTarget().equals("")) {
				binder.setDisallowedFields(new String[] { "pais" });
				if ((binder.getTarget() instanceof Usuario)) {
					Usuario usuario = (Usuario) binder.getTarget();
		
					Long paisId = null;
					try {
						paisId = ( request.getParameter("pais") != null ? Long.parseLong(request
								.getParameter("pais")) : null);
					} catch (Exception e) {
					}
					if (paisId != null) {
						Pais pais = paisSrv
								.obtenerPais(paisId);
						usuario.setPais(pais);
					}
					
				}
			}
		}
	

		
		/**
		 * Valida los datos ingresados en el alta o edicion
		 * del camion
		 * @param camionDto
		 * @param errors
		 */
		private void validarDatosIngresados(Usuario usuario, BindingResult errors) {
			validator.validate(usuario, errors);
		}


	}

